home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Warrior’s Progress / source code / Source / Libraries / Lists / List.cp < prev    next >
Encoding:
Text File  |  1997-06-28  |  2.7 KB  |  156 lines  |  [TEXT/CWIE]

  1. // List.cp
  2.  
  3. #ifndef List_h
  4. #include "List.h"
  5. #endif
  6. #ifndef ListNode_h
  7. #include "ListNode.h"
  8. #endif
  9. #ifndef SequenceLoop_h
  10. #include "SequenceLoop.h"
  11. #endif
  12.  
  13. List::List()
  14.   : first( 0 ),
  15.      last( 0 )
  16.   {
  17.   }
  18.  
  19. List::~List()
  20.   {
  21.     Assert( IsEmpty() );
  22.   }
  23.  
  24. void List::Add( Node& node, BeforeStart )
  25.   {
  26.     Assert( !node.Owned() );
  27.     
  28.     WillAdd( node, after, 0 );
  29.     
  30.     node.previous = 0;
  31.     node.next = first;
  32.     first = &node;
  33.     if ( node.next != 0 )
  34.         node.next->previous = &node;
  35.      else
  36.         last = &node;
  37.     node.owner = this;
  38.   }
  39.  
  40. void List::Add( Node& node, AfterEnd )
  41.   {
  42.     Assert( !node.Owned() );
  43.     
  44.     WillAdd( node, before, 0 );
  45.  
  46.     node.next = 0;
  47.     node.previous = last;
  48.     last = &node;
  49.     if ( node.previous != 0 )
  50.         node.previous->next = &node;
  51.      else
  52.         first = &node;
  53.     node.owner = this;
  54.   }
  55.  
  56. void List::Add( Node& node, Before, const Node& position )
  57.   {
  58.     Assert( !node.Owned() );
  59.     Assert( position.owner == this );
  60.     
  61.     WillAdd( node, before, &position );
  62.     
  63.     node.next = const_cast< Node * >( &position );
  64.     node.previous = position.previous;
  65.     node.next->previous = &node;
  66.     if ( node.previous != 0 )
  67.         node.previous->next = &node;
  68.      else
  69.         first = &node;
  70.     node.owner = this;
  71.   }
  72.  
  73. void List::Add( Node& node, After, const Node& position )
  74.   {
  75.     Assert( !node.Owned() );
  76.     Assert( position.owner == this );
  77.     
  78.     WillAdd( node, after, &position );
  79.  
  80.     node.next = position.next;
  81.     node.previous = const_cast< Node * >( &position );
  82.     node.previous->next = &node;
  83.     if ( node.next != 0 )
  84.         node.next->previous = &node;
  85.      else
  86.         last = &node;
  87.     node.owner = this;
  88.   }
  89.  
  90. void List::Add( Node& node, Before, const Loop& position )
  91.   {
  92.     Assert( &position.Owner() == this );
  93.     Assert( position.Unfinished() );
  94.     Assert( !node.Owned() );
  95.     
  96.     if ( !position.Null() )
  97.         Add( node, before, *position );
  98.      else
  99.       {
  100.         const Node *previous = position.Previous();
  101.         
  102.         if ( previous == 0 )
  103.             Add( node, beforeStart );
  104.          else
  105.             Add( node, after, *previous );
  106.       }
  107.   }
  108.  
  109. void List::Add( Node& node, After, const Loop& position )
  110.   {
  111.     Assert( &position.Owner() == this );
  112.     Assert( position.Unfinished() );
  113.     Assert( !node.Owned() );
  114.     
  115.     if ( !position.Null() )
  116.         Add( node, after, *position );
  117.      else
  118.       {
  119.         const Node *next = position.Next();
  120.         
  121.         if ( next == 0 )
  122.             Add( node, afterEnd );
  123.          else
  124.             Add( node, before, *next );
  125.       }
  126.   }
  127.  
  128. void List::Remove( Node& node )
  129.   {
  130.     Assert( node.owner == this );
  131.  
  132.     WillRemove( node );
  133.     
  134.     if ( node.next != 0 )
  135.         node.next->previous = node.previous;
  136.      else
  137.         last = node.previous;
  138.     
  139.     if ( node.previous != 0 )
  140.         node.previous->next = node.next;
  141.      else
  142.         first = node.next;
  143.     
  144.     node.previous = 0;
  145.     node.next = 0;
  146.     node.owner = 0;
  147.   }
  148.  
  149. void List::RemoveAll()
  150.   {
  151.     while( !IsEmpty() )
  152.         Remove( *first );
  153.   }
  154.  
  155. #include "Sequence.cp"
  156.